// original code obtained from https://www.shadertoy.com/view/lscyWr
// by owmywrists 2018-02-13
// converted to osl

#include "octane-oslintrin.h"

vector xz(vector vec)
{
    return vector(vec[0],vec[2], 0);
}

vector xy(vector vec)
{
    return vector(vec[0], vec[1], 0);
}

vector vec2(float a, float b)
{
    return vector(a,b,0);
}

vector frac(vector v)
{
    return v - vector(floor(v[0]), floor(v[1]), floor(v[2]));
}

float fracf(float f)
{
    return f - floor(v);
}


float planeSDF(vector p)
{
    float w = 1.0 / sqrt(2);
    vector n = vector(0, w, 0);
    return dot(p, n) + w; 
}

float displace(float d1,vector p, vector noise)
{
    float d2 = noise[0];
    return d1 + d2;
}
    
float sphereSDF(vector p, float r)
{
    return length(p) -r;
}

float boxSDF(vector p, float size)
{
  return length(max(abs(p)- vector(size),0.0));
}

float repeat_sphere(vector p, vector c)
{
    vector q = mod(p,c) - 0.5*c;
    
    return boxSDF(q, 7.0);
}

float smin(float a, float b, float k)
{
    float res = exp(-k*a) + exp(-k*b);
    return -log(res)/k;
}

float sceneSDF(vector p, vector noise)
{
    float terrain = displace(planeSDF(p), p, noise);
    return terrain;
}

#include "octane-oslintrin.h"

shader OslGeometry(
    color noiseTex = color(1,1,1),
    color noiseTex2 = color(1,1,1),
    float noiseScale = 0.1,
    float noiseScale2 = 0.1,
    float timeScale = 1,
    output _sdf c = _SDFDEF)
{
    color t = _evaluateDelayed(noiseTex, P[0] + time*timeScale, P[2]);
    color t2 = _evaluateDelayed(noiseTex2, P[0] + time*timeScale, P[2]); 
    c.dist = sceneSDF(P,-1*(t*noiseScale+t2*noiseScale2));
    c.u = P[0] + time*timeScale;
    c.v = P[2];
}
